תרגיל בית מספר 6 )אחרון!( - להגשה עד 21 ביוני )יום ראשון( בשעה ::225 קיראו בעיון את הנחיות העבודה וההגשה המופיעות באתר הקורס, תחת התיקייה.assignments חריגה מההנחיות תגרור ירידת ציון / פסילת התרגיל. הגשה: תשובותיכם יוגשו בקובץ pdf ובקובץ py בהתאם להנחיות בכל שאלה. השתמשו בקובץ השלד skeleton6.py כבסיס לקובץ ה py אותו אתם מגישים. לא לשכוח לשנות את שם הקובץ למספר ת"ז שלכם לפני ההגשה, עם סיומת.py בסה"כ מגישים שני קבצים בלבד. עבור סטודנטית שמספר ת"ז שלה הוא 012345678 הקבצים שיש להגיש הם.012345678.py ו- 012345678.pdf הקפידו לענות על כל מה שנשאלתם. תשובות מילוליות והסברים צריכים להיות תמציתיים, קולעים וברורים. להנחיה זו מטרה כפולה: 1. על מנת שנוכל לבדוק את התרגילים שלכם בזמן סביר. 2. כדי להרגיל אתכם להבעת טיעונים באופן מתומצת ויעיל, ללא פרטים חסרים מצד אחד אך ללא עודף בלתי הכרחי מצד שני. זוהי פרקטיקה חשובה במדעי המחש הערות: כל השאלות בתרגיל זה מבוססות על שאלות ממבחנים משנים קודמות, עם שינויים מסויימים. 1. לייד כל שאלה מצויין מספר הנקודות שהיא מקנה בתרגיל הבית )לא בהכרח מספר הנקודות שהשאלה היתה שווה במבחן(. ניתן להגיע למקסימום של 111 נקודות..2 שאלה 4 איננה להגשה, ותקבלו עליה אוטומטית 31 נק' )כלומר הציון מתחיל מ- 31(. 3. עמ' 1 מתוך 6
שאלה 1 קארפ-רבין )04 נק'( בשאלה זו נרצה לענות על השאלה, האם תמונה נתונה מכילה תת-תמונה ריבועית בגודל נתון שחוזרת על עצמה יותר מפעם אחת, כאשר שני מופעים של תת תמונה יכולים לחפוף אחד את השני באופן חלקי. נכנה את תת-התמונה חלון, ונניח שגודלו k x k פיקסלים. התמונה השלמה היא בגודל n שורות על m עמודות, ומתקיים min(n,m) =>k. התמונה וכן החלון ייוצגו באמצעות המחלקה Matrix שראינו בקורס. כל פיקסל מייצג ערך אפור בין 1 )שחור( ל- 222 )לבן(. פתרון יעיל אפשרי מתבסס על הרעיון של אלגוריתם,Karp-Rabin בו השתמשנו על מנת לחפש מחרוזת תבנית בתוך מחרוזת טקסט: מחשבים מעין טביעת אצבע של כל החלונות בגודל k x k אשר מוכלים בתמונה הגדולה. מדווחים על חזרה אם נמצאו שתי טביעות אצבע שוות. לשם פשטות ניתוח הסיבוכיות, בכל הסעיפים נניח כי פעולות חיבור וחיסור והשוואה בין מספרים שלמים רצות בזמן קבוע (1)O )כלומר ללא תלות בגודל המספר(. נגדיר אם כן פונקציה,fingerprint אשר בהינתן מטריצה ריבועית k x k מחזירה מספר, שנקרא לו "טביעת אצבע" של המטריצה: def fingerprint(mat): assert isinstance(mat,matrix) k,makesure = mat.dim() assert k == makesure return sum(mat[i,j] for i in range(k) for j in range(k)) לצורך פתרון יעיל, נזדקק לפונקציה move_right אשר מקבלת )בסדר זה( תמונה mat )כלומר אובייקט מסוג,)Matrix אינדקסי שורה i ועמודה j של פיקסל בתוכה, גודל חלון k, ואת טביעת האצבע fp של החלון בגודל,kxk אשר הפינה השמאלית העליונה שלו ממוקמת.mat[i][j] הפונקציה מחזירה את טביעת האצבע של החלון אשר מתקבל על ידי הזזת החלון ימינה בפיקסל אחד. הפונקציה תניח כי החלון מימין אכן קיים )כלומר שלא הגענו לגבול הימני של התמונה(. לדוגמה, לאחר רצף הפקודות fp = fingerprint(mat[0:k,0:k]) right_fp = move_right(mat,0,0,k,fp) מתקיים right_fp == fingerprint(mat[0:k,1:k+1]) א. השלימו בקובץ השלד את מימוש הפונקציה,move_right בסיבוכיות זמן ריצה.O(k) השלימו בקובץ השלד את מימוש הפונקציה,move_down בסיבוכיות זמן ריצה.O(k) ההבדל בין פונקציה זו לזו מסעיף א' הוא ש move_down מחזירה את טביעת האצבע של החלון אשר מתקבל על ידי הזזת החלון עמ' 2 מתוך 6
ג. ד. אוניברסיטת תל אביב - בית הספר למדעי המחשב המקורי מטה בפיקסל אחד. גם כאן הפונקציה מניחה כי החלון שלמטה אכן קיים )כלומר שלא הגענו לגבול התחתון של התמונה(. עתה נממש את הפונקציה,has_repeating_subfigure שמקבלת מטריצה mat שמייצגת תמונה, וגודל צלע k של חלון ריבועי. הפונקציה תחזיר True אם יש בתמונה תת-תמונה ריבועית בגודל kxk שמופיעה בה יותר מפעם אחת, אחרת.False כאמור, מותרות חפיפות בין תת-תמונות. הנחיות: )1( מותר שהפונקציה תחזיר תשובה שגויה, אם לשני "חלונות" שונים יש אותה טביעת אצבע. )2( חישוב טביעות האצבע ייעשה ע"י הפונקציות מהסעיפים הקודמים. )3( המקרה הגרוע ביותר מבחינת סיבוכיות הריצה הוא כאשר התמונה אינה מכילה תת-תמונה חוזרת )מדוע?(. במקרה זה סיבוכיות הזמן הדרושה לחישוב כל טביעות האצבע תהיה,O(mnk) ואילו סיבוכיות הזמן הדרושה לכלל הבדיקות האם יש טביעות אצבע חוזרות )בהינתן טביעות האצבע( תהיה O(mn) בממוצע )חישבו באיזה מבנה נתונים של פייתון יש לאחסן את טביעות האצבע כדי לעמוד בדרישה האחרונה(. ציינו את חסרונה העיקרי של הפונקציה fingerprint שהופיעה בתחילת השאלה, ביחס לבעיה אותה אנו מנסים לפתור בשאלה זו. תארו במילים שיפור אפשרי לפונקציה, שיסייע להתגבר על חסרון זה. דוגמאות הרצה )שחור,1 לבן,222 אפור - :)121 >>> im = Matrix.load("./sample.bitmap") >>> im.display(zoom = 50) >>> k=2 >>> fingerprint(im[:k,:k]) 384 >>> fingerprint(im[1:k+1,1:k+1]) 256 >>> move_right(im, 0, 0, k, 384) 511 >>> move_down(im, 0, 1, k, 511) 256 >>> has_repeating_subfigure(im, k) True >>> has_repeating_subfigure(im, 3) False # there is no repeating subfigure of size 3x3 עמ' 3 מתוך 6
שאלה 2 דחיסת האפמן )24 נק'( נסמן ב- א. את המספר ה- בסדרת פיבונאצ'י, כאשר האיבר הראשון הינו והאיבר השני הינו. הוכיחו כי מתקיים: לכל טבעי. נתון קורפוס )corpus( שבו תדירויות התווים השונים הן מספרי פיבונאצ'י הראשונים ),1,1,2,3(. מהו אורך קידוד האפמן הקצר ביותר ומהו אורך קידוד האפמן הארוך ביותר של תו כלשהו ע"פ קורפוס זה? נמקו תוך שימוש בטענה המוצגת בסעיף א'. ג. נתון קורפוס עם 128=k תווים שונים, בעלי התדירויות:. בנוסף מתקיים:.). יהי p התו בעל התדירות המינימלית ( יהיו מהו ההפרש בין שדרושים כדי לקודד את התו על תשובתכם להיות מנומקת. (, ו- קודי ההאפמן שמתקבלים עבור התווים התו בעל התדירות המקסימלית ( בהתאמה. )מספר הביטים שדרושים כדי לקודד את התו ) לבין )מספר הביטים? ) עמ' 4 מתוך 6
)24 נק'( שאלה 3 זיו למפל כזכור, באלגוריתם Lempel-Ziv דוחסים חזרות באורך לפחות 3 )מתעלמים מחזרות באורך 1,2 משום שדחיסתן אינה משתלמת(. אם נסמן ב- L את אורך החזרה המינימלי שהאלגוריתם דוחס, אז 3=L. האם תיתכן מחרוזת שדחיסתה עם 4=L תהיה יעילה יותר מאשר עם 3=L? כלומר האם ייתכן שגם אם גילינו חזרה באורך 3, ישתלם לא לדחוס אותה? אם לדעתכם כן, רשמו דוגמה למחרוזת כזו, וכן את את ייצוג הביניים* של הדחיסה, עבור 3=L ועבור 4=L. אם לדעתכם לא, הסבירו מדוע. * דוגמה לייצוג ביניים: ייצוג הביניים של המחרוזת abcabcdedede הוא [ a, b, c,(3,3), d, e,(2,4)] א..i לפניכם מוצג קוד עבור הפונקציה genstring(n) שמייצרת מחרוזת באורך n מתוך התפלגות ידועה של שכיחות אותיות )הנתונה ע"י המחרוזת freq בקוד(. def genstring(n): freq = 'a'*25+'bcdefghijklmnopqrstuvwxyz' randletters = [random.choice(freq) for i in range(n)] return ''.join(randletters) תהי.s=genString(100000) איזו דחיסה צפויה לתת יחס דחיסה טוב יותר עבור Huffman s: או?Lempel-Ziv הסבירו את תשובתכם בצירוף מספר דוגמאות הרצה שיתמכו בה. אין צורך בהוכחה מתמטית פורמלית. הבהרה: קידוד Huffman כאן ישתמש ב- s הן בתור corpus והן בתור.text נחליף את המחרוזת freq במחרוזת הבאה: 'a'*2500+'bcdefghijklmnopqrstuvwxyz' freq = האם לדעתכם התשובה תשתנה? הסבירו..ii ג. נניח שעבור טקסט באורך n, מאפשרים לאורך החזרה המקסימלי באלגוריתם Lempel-Ziv להיות 1-n )במקום 31 כפי שמופיע בערכי ברירת המחדל של האלגוריתם שהוצג בהרצאה(. שאר פרטי האלגוריתם ללא שינוי. רוצים לדחוס באופן זה את המחרוזת 01010101 באורך n. כיצד נראה ייצוג הביניים של הדחיסה? מהו יחס הדחיסה )=מספר הביטים במחרוזת הדחוסה חלקי מספר הביטים במחרוזת ללא שימוש בדחיסת למפל-זיו( כתלות ב- n? תנו תשובה בסדר גודל במונחים של ( )O. טיפ: כדאי לבדוק את התשובות בשאלה זו ע"י הרצות... עמ' 5 מתוך 6
שאלה 0 קודים לאיתור ולתיקון שגיאות )לא להגשה, 34 נק'( חלק ראשון הקוד לתיקון טעויות המתואר כאן מעתיק 3 ביטים של אינפורמציה למילות קוד בנות 7 ביטים, על פי הסכמה הבאה: (x 1, x 2, x 3 ) (x 1, x 2, x 3, x 1 + x 2, x 1 + x 3, x 2 + x 3, x 1 + x 2 +x 3 ) כאשר הסכומים מחושבים מודולו 2. א. בטבלה הבאה, השלימו בכל שורה את מילת הקוד המתקבלת מ- 3 הביטים הרשומים בה. (x 1, x 2, x 3 ) (x 1, x 2, x 3, x 1 + x 2, x 1 + x 3, x 2 + x 3, x 1 + x 2 +x 3 ) (0, 0, 0) (0, 0, 1) (0, 1, 1) (1, 1, 1) מהו המרחק המינימלי, d, של הקוד? רשמו שתי מילות קוד שונות w, 1, w 2 שהמרחק ביניהן הוא d. ג. כך שיש שתי מילות קוד שונות w, 1, w 2 המקיימות: המרחק של שתיהן מ- טענה: קיימת מילה y שווה, ומרחק זה הוא המרחק המינימלי מ- y למילת קוד כלשהי. החליטו אם הטענה הנ"ל נכונה. אם לדעתכם הטענה נכונה תנו דוגמה ל- w 2 w, 1 y, כאלו. אחרת הסבירו מדוע לא. חלק שני להלן פונקציית קידוד עבור קוד חדש בשם, bad_coding המקבלת רשימת ביטים x ומוציאה רשימת ביטים. def bad_coding(x): z = (x[0]+x[1]) % 2 return (x+[z])*4. תזכורת: קוד עם מרחק מינימלי נקרא קוד מטיפוס האורך של x יסומן כרגיל ב- x..[n=, k=, d= ] השלימו את המשפט הבא: bad_coding הוא קוד מטיפוס סוף עמ' 6 מתוך 6